package com.tk.mygenerate;

import static org.mybatis.generator.internal.util.StringUtility.isTrue;

import java.util.Date;
import java.util.Properties;
import java.util.Set;
import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.InnerClass;
import org.mybatis.generator.api.dom.java.InnerEnum;
import org.mybatis.generator.api.dom.java.JavaElement;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.MergeConstants;
import org.mybatis.generator.config.PropertyRegistry;

/**
 * @author tiankuo
 */
public class MyDefaultCommentGenerator implements CommentGenerator {


  private Properties properties;
  private boolean suppressDate;
  private boolean suppressAllComments;

  public MyDefaultCommentGenerator() {
    super();
    properties = new Properties();
    suppressDate = false;
    suppressAllComments = false;
  }

  @Override
  public void addJavaFileComment(CompilationUnit compilationUnit) {
  }

  /**
   * Adds a suitable comment to warn users that the element was generated, and when it was
   * generated.
   */
  @Override
  public void addComment(XmlElement xmlElement) {
    if (suppressAllComments) {
      return;
    }

//    xmlElement.addElement(new TextElement("<!--"));
//
//    StringBuilder sb = new StringBuilder();
//    sb.append("  WARNING - ");
//    sb.append(MergeConstants.NEW_ELEMENT_TAG);
//    xmlElement.addElement(new TextElement(sb.toString()));
//    xmlElement
//        .addElement(new TextElement(
//            "  This element is automatically generated by MyBatis Generator, do not modify."));
//
//    String s = getDateString();
//    if (s != null) {
//      sb.setLength(0);
//      sb.append("  This element was generated on ");
//      sb.append(s);
//      sb.append('.');
//      xmlElement.addElement(new TextElement(sb.toString()));
//    }
//
//    xmlElement.addElement(new TextElement("-->"));
  }

  @Override
  public void addRootComment(XmlElement rootElement) {
  }

  @Override
  public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable,
      Set<FullyQualifiedJavaType> imports) {

  }

  @Override
  public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable,
      IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> imports) {

  }

  @Override
  public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable,
      Set<FullyQualifiedJavaType> imports) {

  }

  @Override
  public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable,
      IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> imports) {

  }

  @Override
  public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable,
      Set<FullyQualifiedJavaType> imports) {

  }

  @Override
  public void addConfigurationProperties(Properties properties) {
    this.properties.putAll(properties);

    suppressDate = isTrue(properties
        .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));

    suppressAllComments = isTrue(properties
        .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
  }

  /**
   * This method adds the custom javadoc tag for. You may do nothing if you do not wish to include
   * the Javadoc tag - however, if you do not include the Javadoc tag then the Java merge capability
   * of the eclipse plugin will break.
   *
   * @param javaElement the java element
   */
  protected void addJavadocTag(JavaElement javaElement,
      boolean markAsDoNotDelete) {
    javaElement.addJavaDocLine(" *");
    StringBuilder sb = new StringBuilder();
    sb.append(" * ");
    sb.append(MergeConstants.NEW_ELEMENT_TAG);
    if (markAsDoNotDelete) {
      sb.append(" do_not_delete_during_merge");
    }
    String s = getDateString();
    if (s != null) {
      sb.append(' ');
      sb.append(s);
    }
    javaElement.addJavaDocLine(sb.toString());
  }

  /**
   * This method returns a formated date string to include in the Javadoc tag and XML comments. You
   * may return null if you do not want the date in these documentation elements.
   *
   * @return a string representing the current timestamp, or null
   */
  protected String getDateString() {
    if (suppressDate) {
      return null;
    } else {
      return new Date().toString();
    }
  }

  @Override
  public void addClassComment(InnerClass innerClass,
      IntrospectedTable introspectedTable) {
    if (suppressAllComments) {
      return;
    }

    StringBuilder sb = new StringBuilder();

    innerClass.addJavaDocLine("/**");
    innerClass
        .addJavaDocLine(" * This class was generated by MyBatis Generator.");

    sb.append(" * This class corresponds to the database table ");
    sb.append(introspectedTable.getFullyQualifiedTable());
    innerClass.addJavaDocLine(sb.toString());

    addJavadocTag(innerClass, false);

    innerClass.addJavaDocLine(" */");
  }

  @Override
  public void addEnumComment(InnerEnum innerEnum,
      IntrospectedTable introspectedTable) {
    if (suppressAllComments) {
      return;
    }

    StringBuilder sb = new StringBuilder();

    innerEnum.addJavaDocLine("/**");
    innerEnum
        .addJavaDocLine(" * This enum was generated by MyBatis Generator.");

    sb.append(" * This enum corresponds to the database table ");
    sb.append(introspectedTable.getFullyQualifiedTable());
    innerEnum.addJavaDocLine(sb.toString());

    addJavadocTag(innerEnum, false);

    innerEnum.addJavaDocLine(" */");
  }

  @Override
  public void addFieldComment(Field field,
      IntrospectedTable introspectedTable,
      IntrospectedColumn introspectedColumn) {
//        if (suppressAllComments) {
//            return;
//        }
//
//        StringBuilder sb = new StringBuilder();
//
//        field.addJavaDocLine("/**");
//        field
//                .addJavaDocLine(" * This field was generated by MyBatis Generator.");
//
//        sb.append(" * This field corresponds to the database column ");
//        sb.append(introspectedTable.getFullyQualifiedTable());
//        sb.append('.');
//        sb.append(introspectedColumn.getActualColumnName());
//        field.addJavaDocLine(sb.toString());
//
//        addJavadocTag(field, false);
//
//        field.addJavaDocLine(" */");

    field.addJavaDocLine("/**");
//    field.addJavaDocLine(" * <pre>");
    field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
//    field.addJavaDocLine(
//        " * " + introspectedTable.getFullyQualifiedTable() + '.' + introspectedColumn
//            .getActualColumnName());
//    field.addJavaDocLine(" * </pre>");
    field.addJavaDocLine(" */");
//    field.addJavaDocLine("@Column");
  }

  @Override
  public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
    if (suppressAllComments) {
      return;
    }

    StringBuilder sb = new StringBuilder();

    field.addJavaDocLine("/**");
    field
        .addJavaDocLine(" * This field was generated by MyBatis Generator.");

    sb.append(" * This field corresponds to the database table ");
    sb.append(introspectedTable.getFullyQualifiedTable());
    field.addJavaDocLine(sb.toString());

    addJavadocTag(field, false);

    field.addJavaDocLine(" */");
  }

  @Override
  public void addModelClassComment(TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable) {

  }

  @Override
  public void addGeneralMethodComment(Method method,
      IntrospectedTable introspectedTable) {
    if (suppressAllComments) {
      return;
    }

//    StringBuilder sb = new StringBuilder();
//    method.addJavaDocLine("/**");
//    method
//        .addJavaDocLine(" * This method was generated by MyBatis Generator.");
//    sb.append(" * This method corresponds to the database table ");
//    sb.append(introspectedTable.getFullyQualifiedTable());
//    method.addJavaDocLine(sb.toString());
//    addJavadocTag(method, false);
//    method.addJavaDocLine(" */");
  }

  @Override
  public void addGetterComment(Method method,
      IntrospectedTable introspectedTable,
      IntrospectedColumn introspectedColumn) {
    if (suppressAllComments) {
      return;
    }

    StringBuilder sb = new StringBuilder();

//    method.addJavaDocLine("/**");
//    method
//        .addJavaDocLine(" * This method was generated by MyBatis Generator.");
//
//    sb.append(" * This method returns the value of the database column ");
//    sb.append(introspectedTable.getFullyQualifiedTable());
//    sb.append('.');
//    sb.append(introspectedColumn.getActualColumnName());
//    method.addJavaDocLine(sb.toString());
//
//    method.addJavaDocLine(" *");
//
//    sb.setLength(0);
//    sb.append(" * @return the value of ");
//    sb.append(introspectedTable.getFullyQualifiedTable());
//    sb.append('.');
//    sb.append(introspectedColumn.getActualColumnName());
//    method.addJavaDocLine(sb.toString());
//
//    addJavadocTag(method, false);
//
//    method.addJavaDocLine(" */");

  }

  @Override
  public void addSetterComment(Method method,
      IntrospectedTable introspectedTable,
      IntrospectedColumn introspectedColumn) {
    if (suppressAllComments) {
      return;
    }

//    StringBuilder sb = new StringBuilder();
//
//    method.addJavaDocLine("/**");
//    method
//        .addJavaDocLine(" * This method was generated by MyBatis Generator.");
//
//    sb.append(" * This method sets the value of the database column ");
//    sb.append(introspectedTable.getFullyQualifiedTable());
//    sb.append('.');
//    sb.append(introspectedColumn.getActualColumnName());
//    method.addJavaDocLine(sb.toString());
//
//    method.addJavaDocLine(" *");
//
//    Parameter parm = method.getParameters().get(0);
//    sb.setLength(0);
//    sb.append(" * @param ");
//    sb.append(parm.getName());
//    sb.append(" the value for ");
//    sb.append(introspectedTable.getFullyQualifiedTable());
//    sb.append('.');
//    sb.append(introspectedColumn.getActualColumnName());
//    method.addJavaDocLine(sb.toString());
//
//    addJavadocTag(method, false);
//
//    method.addJavaDocLine(" */");
  }

  @Override
  public void addClassComment(InnerClass innerClass,
      IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
    if (suppressAllComments) {
      return;
    }

    StringBuilder sb = new StringBuilder();

    innerClass.addJavaDocLine("/**");
    innerClass
        .addJavaDocLine(" * This class was generated by MyBatis Generator.");

    sb.append(" * This class corresponds to the database table ");
    sb.append(introspectedTable.getFullyQualifiedTable());
    innerClass.addJavaDocLine(sb.toString());

    addJavadocTag(innerClass, markAsDoNotDelete);

    innerClass.addJavaDocLine(" */");
  }

}
